﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using TaxiCaosSOAPService.Persistencia;
using TaxiCaosSOAPService.Dominio;
using TaxiCaosSOAPService.Exceptions;

namespace TaxiCaosSOAPService
{
    public class Reservas : IReservas
    {

        private ReservaDAO reservaDAO = null;
        private ReservaDAO ReservaDAO
        {
            get
            {
                if (reservaDAO == null)
                    reservaDAO = new ReservaDAO();
                return reservaDAO;
            }
        }

        public int ObtenerCantidadReservas(int idCliente)
        {
            return ReservaDAO.ObtenerCantidadReservas(idCliente);
        }

        public Reserva RegistrarReserva(Nullable<int> idCliente, int idTarifa, string tipo, string nombres, string apellidos, string telefono, string email, DateTime fechaHora, string direccion, string comentarios, double montoBruto, double descuento, double montoNeto)
        {
            Reserva reserva = new Reserva();
            reserva.IdCliente = idCliente;

            // Se obtiene al empleado (TAXISTA) disponible para atender la reserva
            EmpleadosWS.EmpleadosClient proxyEmpleado = new EmpleadosWS.EmpleadosClient();
            EmpleadosWS.Empleado empleadoDisponible = proxyEmpleado.ObtenerEmpleadoDisponible("TXSTA");
            if (empleadoDisponible == null)
            {
                ReservaException ex = new ReservaException();
                ex.Message = "No se encuentran empleados disponibles para atender su reserva. Por favor, intente nuevamente en unos minutos";
                throw new FaultException<ReservaException>(ex, ex.Message);
            }
            reserva.IdEmpleado = empleadoDisponible.IdEmpleado;

            reserva.IdTarifa = idTarifa;
            reserva.Ticket = ReservaDAO.ObtenerSiguienteNroTicket(); // se autogenera incrementalmente
            reserva.Tipo = tipo;
            reserva.Estado = "RSERV"; // Reservada
            reserva.Nombres = nombres;
            reserva.Apellidos = apellidos;
            reserva.Telefono = telefono;
            reserva.Email = email;
            reserva.FechaHora = fechaHora;
            reserva.Direccion = direccion;
            reserva.Comentarios = comentarios;

            Reserva reservaCreada = ReservaDAO.Crear(reserva);

            // Se graba la factura en estado PENDIENTE
            FacturasWS.FacturasClient proxyFactura = new FacturasWS.FacturasClient();
            FacturasWS.Factura factura = new FacturasWS.Factura();
            factura.IdReserva = reservaCreada.IdReserva;
            factura.IdPago = null;
            factura.Estado = "PEND";
            factura.MontoBruto = montoBruto;
            factura.Descuento = descuento;
            factura.MontoNeto = montoNeto;

            proxyFactura.CrearFactura(factura);

            // Se actualiza el estado del empleado a NO DISPONIBLE
            empleadoDisponible.Estado = "NDISP";
            proxyEmpleado.ModificarEmpleado(empleadoDisponible);

            return reservaCreada;

        }
    }
}
